这段代码是Haru Free PDF Library中关于PDF页面（Pages）的源文件 `hpdf_pages.c` 的头文件部分。它定义了PDF页面相关的数据结构、函数原型和类型定义。以下是对代码的详细解释：

1. **版权声明**：注释块提供了Haru PDF库的版权信息。

2. **宏定义**：`#ifndef _HPDF_PAGES_H` 和 `#define _HPDF_PAGES_H` 用于防止头文件被多次包含。

3. **包含其他头文件**：
   - `#include "hpdf_gstate.h"` 包含了图形状态相关的头文件。
   - `#include "hpdf_ext_gstate.h"` 包含了扩展图形状态相关的头文件。

4. **C++兼容性**：条件编译指令，确保当使用C++编译器时，这些函数以C的方式进行链接。

5. **页面集合操作函数原型**：
   - `HPDF_Pages_New`：创建一个新的页面集合对象。
   - `HPDF_Pages_Validate`：验证页面集合对象的有效性。
   - `HPDF_Pages_AddKids`：向页面集合中添加子项。
   - `HPDF_Page_InsertBefore`：在页面集合中的指定页面前插入一个页面。

6. **页面属性记录结构体定义**：
   - `_HPDF_PageAttr_Rec` 结构体定义了PDF页面的属性，包括父页面、字体字典、扩展对象字典、扩展图形状态字典、渐变字典、当前图形状态、字符串位置、当前位置、文本位置、文本矩阵、图形模式、内容字典、流、交叉引用表、压缩模式和PDF版本。

7. **页面操作函数原型**：
   - `HPDF_Page_Validate`：验证页面对象的有效性。
   - `HPDF_Page_New`：创建一个新的页面对象。
   - `HPDF_Page_GetInheritableItem`：获取页面可继承的项目。
   - `HPDF_Page_GetXObjectName`：根据页面和图形对象获取对象名称。
   - `HPDF_Page_GetLocalFontName`：根据页面和字体获取本地字体名称。
   - `HPDF_Page_GetExtGStateName`：根据页面和扩展图形状态获取名称。
   - `HPDF_Page_GetShadingName`：根据页面和渐变获取名称。
   - `HPDF_Page_GetMediaBox`：获取页面的媒体框。
   - `HPDF_Page_SetBoxValue`：设置页面框的值。
   - `HPDF_Page_SetFilter`：设置页面的过滤器。
   - `HPDF_Page_CheckState`：检查页面的状态。

8. **结束C++兼容性条件编译**：`#ifdef __cplusplus` 和 `#endif /* __cplusplus */` 结束C++兼容性代码块。

9. **结束宏定义**：`#endif /* _HPDF_PAGES_H */` 结束头文件的宏定义。

这个头文件提供了在PDF文档中创建和管理页面的功能，包括页面集合的创建、页面的验证、页面属性的获取和设置等。通过这些函数，开发者可以构建PDF文档的结构，管理页面的布局和内容。/*
 * << Haru Free PDF Library >> -- hpdf_pages.c
 *
 * URL: http://libharu.org
 *
 * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
 * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 * It is provided "as is" without express or implied warranty.
 *
 */

#ifndef _HPDF_PAGES_H
#define _HPDF_PAGES_H

#include "hpdf_gstate.h"
#include "hpdf_ext_gstate.h"

#ifdef __cplusplus
extern "C" {
#endif

/*----------------------------------------------------------------------------*/
/*----- HPDF_Pages -----------------------------------------------------------*/

HPDF_Pages
HPDF_Pages_New  (HPDF_MMgr   mmgr,
                 HPDF_Pages  parent,
                 HPDF_Xref   xref);


HPDF_BOOL
HPDF_Pages_Validate  (HPDF_Pages  pages);


HPDF_STATUS
HPDF_Pages_AddKids  (HPDF_Pages  parent,
                      HPDF_Dict   kid);


HPDF_STATUS
HPDF_Page_InsertBefore  (HPDF_Page   page,
                         HPDF_Page   target);


typedef struct _HPDF_PageAttr_Rec  *HPDF_PageAttr;

typedef struct _HPDF_PageAttr_Rec {
    HPDF_Pages         parent;
    HPDF_Dict          fonts;
    HPDF_Dict          xobjects;
    HPDF_Dict          ext_gstates;
    HPDF_Dict          shadings;
    HPDF_GState        gstate;
    HPDF_Point         str_pos;
    HPDF_Point         cur_pos;
    HPDF_Point         text_pos;
    HPDF_TransMatrix   text_matrix;
    HPDF_UINT16        gmode;
    HPDF_Dict          contents;
    HPDF_Stream        stream;
    HPDF_Xref          xref;
    HPDF_UINT          compression_mode;
	HPDF_PDFVer       *ver; 
} HPDF_PageAttr_Rec;


/*----------------------------------------------------------------------------*/
/*----- HPDF_Page ------------------------------------------------------------*/

HPDF_BOOL
HPDF_Page_Validate  (HPDF_Page  page);


HPDF_Page
HPDF_Page_New  (HPDF_MMgr   mmgr,
                HPDF_Xref   xref);


void*
HPDF_Page_GetInheritableItem  (HPDF_Page      page,
                               const char    *key,
                               HPDF_UINT16    obj_class);


const char*
HPDF_Page_GetXObjectName  (HPDF_Page     page,
                           HPDF_XObject  xobj);


const char*
HPDF_Page_GetLocalFontName  (HPDF_Page  page,
                             HPDF_Font  font);


const char*
HPDF_Page_GetExtGStateName  (HPDF_Page       page,
                             HPDF_ExtGState  gstate);

const char*
HPDF_Page_GetShadingName  (HPDF_Page    page,
                           HPDF_Shading shading);


HPDF_Box
HPDF_Page_GetMediaBox  (HPDF_Page    page);


HPDF_STATUS
HPDF_Page_SetBoxValue (HPDF_Page     page,
                       const char   *name,
                       HPDF_UINT     index,
                       HPDF_REAL     value);


void
HPDF_Page_SetFilter  (HPDF_Page    page,
                      HPDF_UINT    filter);


HPDF_STATUS
HPDF_Page_CheckState  (HPDF_Page  page,
                       HPDF_UINT  mode);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _HPDF_PAGES_H */

